{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "A discrete controller class\n", "---------------------------\n", "\n", "Let's extend the example from our previous object-oriented simulation notebook to discrete controllers." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy\n", "import scipy.signal\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We start by defining a `class` for the tank system again:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "class TankSystem:\n", " def __init__(self, A, alpha, K, V, Fi):\n", " \"\"\" This special function gets called when an object of this class is created\"\"\"\n", " self.A = A\n", " self.alpha = alpha\n", " self.K = K\n", " self.Fi = Fi\n", " self.change_state(V)\n", " \n", " def f(self, x):\n", " return self.alpha**(x - 1)\n", " \n", " def change_input(self, x):\n", " self.Fo = self.K*self.f(x)*numpy.sqrt(self.h)\n", " \n", " def change_state(self, V):\n", " self.state = self.V = V\n", " self.output = self.h = self.V/self.A\n", "\n", " def derivative(self, x):\n", " self.change_input(x)\n", " dVdt = self.Fi - self.Fo\n", " return dVdt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But this time we'll do a discrete controller:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class DiscreteController:\n", " def __init__(self, DeltaT, Kc, tau_i, bias):\n", " self.DeltaT = DeltaT\n", " self.Kc = Kc\n", " self.tau_i = tau_i\n", " self.next_sample_time = 0\n", " self.error_sum = 0\n", " self.bias = self.output = bias\n", " \n", " def update(self, u, t):\n", " if t >= self.next_sample_time:\n", " self.error_sum += u\n", " self.output = self.Kc*(u + 1/self.tau_i*self.error_sum)\n", " self.next_sample_time += self.DeltaT" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I've changed the way we update the controller here to accomodate the fact that discrete controllers don't have states to integrate, so we don't need the `derivative` method. The way I've built this class requires that the `update` method be called with strictly ascending times in `t`. Note that this class corresponds very closely to a physical box. All the sampling is taking place inside the class and it is designed to be updated in a \"normal\" Euler integration loop. See how using classes makes the calculations which are about a particular physical object (the controller) stay together in the code rather than being spread out in lots of places?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Of course, we still have to test that this works:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ts = numpy.linspace(0, 100, 1000)\n", "dt = ts[1]" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "sp = 1.3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I've changed this function to use the new `update` methods, but otherwise it is similar to the previous one." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def control_simulation_discrete(system, controller):\n", " outputs = []\n", " for t in ts:\n", " system.change_input(controller.output)\n", "\n", " e = sp - system.output\n", "\n", " controller.update(e, t)\n", "\n", " system.change_state(system.state + system.derivative(controller.output)*dt)\n", "\n", " outputs.append(system.output)\n", " return outputs" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "system = TankSystem(A=2, alpha=20, K=2, V=2, Fi=1)\n", "controller = DiscreteController(DeltaT=1, Kc=-1, tau_i=5, bias=0.7)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "outputs = control_simulation_discrete(system, controller)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEACAYAAAC9Gb03AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGNtJREFUeJzt3X2UXXV97/H3J488JIQwJEgSkyDKQ4DE4oWKghxQjIoX\nrRSrqdEquqylXGsrF3Vd14zVrnZVoZYl6orkBqqmAUElqbUqwimNEgQBEx4SAgmE8DA1JAi5JDN5\n+N4/9okzDGfOPmdmz9ln9vm81tor55z9m71/szPrM7/57t/eWxGBmZkV15i8O2BmZiPLQW9mVnAO\nejOzgnPQm5kVnIPezKzgHPRmZgWXGvSSlkrqlrR2kPWHS/q+pN9IWiNpXvbdNDOzoapnRL8MWFhj\n/eeAeyNiAfAh4KosOmZmZtlIDfqIWA3sqNFkHnBrpe0GYK6kadl0z8zMhiuLGv1vgPcASDodmA3M\nymC7ZmaWgSyC/h+AqZLuAS4B7gX2ZbBdMzPLwLjhbiAiXgA+cuC9pM3ApmptJfnGOmZmQxARGurX\n1juiV2V5+QppiqTxldcfA/4zInYOtqGI8BJBZ2dn7n1olcXHwsfCx6L2MlypI3pJy4ES0CFpC9AJ\nTEgyO5YAJwLXSdoPPABcPOxemZlZZlKDPiIWpaxfAxyfWY/MzCxTLXFl7BVXwBNP5N2L5iqVSnl3\noWX4WPTxsejjY5EdZVH/qXtnUlTb36GHwuTJsGIF+P/WzOylJBFNOBk7YiJg1y647jp43/vgyiuT\nz8zMLBvDnl45XL29MHYsLFwIa9Yk/06bBosX590zM7NiyH1Ev2sXHHxw8nruXHjve2Hz5ly7ZGZW\nKLkH/e7dfUEP0NEBzz6bX3/MzIom96DftQsOOqjv/RFHwPbt+fXHzKxoWiLoPaI3Mxs5LRf0Rxzh\noDczy1LuQV+tRu/SjZlZdnIP+oE1epduzMyy1RJB339Ef/jh8PzzsM93tDczy0TuQT+wdDN2LBx2\nGDz3XH59MjMrktyDfuCIHly+MTPLUksEff8aPXjmjZlZlloi6KuN6D3zxswsG6lBL2mppG5JawdZ\nf5iklZLuk7RO0p810oGBNXpw6cbMLEv1jOiXAQtrrL8EeCAiXgucA1whqe67YlYb0bt0Y2aWndSg\nj4jVwI5aTYDJldeTgWcjYm+9HahWo3fpxswsO1nU6L8GzJP0FPAb4JONfLFH9GZmIyuLB48sBO6N\niHMlHQv8TNL8iNhZrXFXV9fvX5dKJXbvLrlGb2bWT7lcplwuZ7a9up4ZK2kOsCoi5ldZ92/A30fE\nLyrvfw5cHhF3V2n7smfGfuAD8Na3wgc/2PfZT38KX/4y/OxnDX43ZmYF1KxnxqqyVPM48JZKZ44C\njgM21dsBl27MzEZWaulG0nKgBHRI2gJ0AhOAiIglwJeAa/tNv/zfEVH3qVRPrzQzG1mpQR8Ri1LW\nP03t6Zc1+YIpM7OR1RJXxg6cXjl5cjLS7+3Np09mZkXSEkE/cEQvuU5vZpaV3IO+Wo0e/JBwM7Os\n5B701Ub04BOyZmZZaYmgH1ijBwe9mVlWWiLoXboxMxs5uQf9YDX6I4+Ebdua3x8zs6LJNej37oX9\n+2H8+Jevc9CbmWUj16A/UJ9XlZsrTJsGv/1t8/tkZlY0uQb9YGUb8IjezCwruY/oBwt6j+jNzLKR\ne9BXm1oJSdB7RG9mNny5B32t0o1H9GZmw9eyNfopU5L1PT3N7ZOZWdG07IheSq6OdfnGzGx4cg/6\nwWr04Dq9mVkWUoNe0lJJ3f2eIDVw/acl3SvpHknrJO2VdHg9O681ogfPvDEzy0I9I/pl1HiCVER8\nJSL+ICJOBT4LlCPiuXp2XqtGD55Lb2aWhdSgj4jVwI46t/d+4F/r3blH9GZmIy+zGr2kg4G3ATfV\n+zVpNfr+I/r9++Hmm2HfvuH108ys3aQ+HLwB/xNYnVa26erq+v3rZ54pMWlSadC206bBAw/Azp2w\neDH88Iewbh2cfHJGPTYza0HlcplyuZzZ9hQR6Y2kOcCqiJhfo833gRsiYkWNNtF/f3/7t7BnD3zx\ni9Xb33ADXHUVPP88nHYabNgAnZ1w3nmpXTYzKwxJRESV2z/Wp97SjSrLYJ2YApwN3NzIztNq9NOn\nwx13wMUXwzXXwNy58PTTjezBzMxSSzeSlgMloEPSFqATmABERCypNHs38JOI2NXIznftSsozgznr\nrKR0c8IJyfujj3bQm5k1KjXoI2JRHW2uA65rdOdp0yvHju0LeUiCfsuWRvdiZtbecr8ytlbQD+QR\nvZlZ43IP+lrTKwdy0JuZNS73oG9kRD9jBjz11Mj1x8ysiFr2NsXVHBjR1zEj1MzMKkbViH7y5OT2\nxS+8MHJ9MjMrmtyDvpEaPbhOb2bWqFFVuoGkTu+gNzOrX+4j+kaD/uijfULWzKwRozLoPaI3M6tf\n7kHvGr2Z2chyjd7MrOByC/r9+6G31yN6M7ORllvQ794NEycm8+Ib4ZOxZmaNyS3oh1KfB4/ozcwa\nleuIvtH6PMDhhyclnxdfzL5PZmZFlOuIfihBL7l8Y2bWiNSgl7RUUrektTXalCTdK+l+SbfVs+Oh\nBj3ArFnw5JND+1ozs3ZTz4h+GbBwsJWV58VeDbwzIk4GLqpnx7t3D61GD0nQb906tK81M2s3qUEf\nEauBHTWaLAJuiognK+231bPj4Y7oHfRmZvXJokZ/HHCEpNsk3SVpcT1fNJygnznTQW9mVq/Uh4PX\nuY1TgXOBQ4E7JN0REY9Ua9zV1QXA+vWwc2cJKDW8w1mzoFweUl/NzFpeuVymnGHIKep4XJOkOcCq\niJhfZd3lwEER8YXK+2uAH0fETVXaxoH9rVgBP/gBXH99452+80649FL41a8a/1ozs9FGEhHR4OWl\nfeot3aiyVHMzcKaksZIOAf4QeChtg67Rm5k1R2rpRtJykvpKh6QtQCcwAYiIWBIR6yX9BFgL7AOW\nRMSDadsdTtC/4hWwbRvs2QPjxw9tG2Zm7SI16CNiUR1tvgJ8pZEdD2d65dixMH16ciuE2bNh795k\nhD937tC2Z2ZWZKPuytgDDpRvnngC5s2DY47Jrm9mZkUyqoP+O9+B00+HxYuTEk5vb3b9MzMrilEb\n9LNnw003wfLl8PnPJ+83bcquf2ZmRZHr3SuHWqMH+Nzn4P774ZxzkveveQ1s3JhN38zMiiSLC6aG\nZLgj+iOPfOl7B72ZWXWjtnQzkIPezKw6B72ZWcGN2hr9QA56M7PqCjOinzMHuruTXyBmZtanMEE/\nblwS9o8+mt02zcyKoDClG3D5xsysmsKM6MFBb2ZWjYPezKzgHPRmZgVXqBr98cfDhg3ZbtPMbLRL\nDXpJSyV1S1o7yPqzJT0n6Z7K8n/q2XFPT/ZBP2sWPP88/O532W7XzGw0q2dEvwxYmNLm9og4tbJ8\nKW2De/dCRDIlMktjxiSj+vXrs92umdlolhr0EbEa2JHSrKGH1vb0wMSJjXxF/U48ER5KfWKtmVn7\nyKpGf4ak+yT9SNK8tMYOejOz5ski6H8NzI6I1wJfA36Y9gUjcSL2AAe9mdlLDbtKHhE7+73+saSv\nSzoiIrZXa9/V1cWOHcn0ynK5RKlUGm4XXsJBb2ajXblcplwuZ7Y9RUR6I2kusCoiTqmy7qiI6K68\nPh24ISLmDrKdiAjWr4d3vWtkpkL29sJhh8Hdd8OaNfBf/wXvfCdcdFH2+zIzawZJRERD50L7Sx3R\nS1oOlIAOSVuATmACEBGxBPhjSZ8A9gC7gD9J2+ZIlm4mTEhG9eefD296Exx6KFx7rYPezNpXatBH\nxKKU9VcDVzey05E8GQtw1119UzefegpOOSWZzqkh/z40Mxu9crkydqSDvv/8/BkzYPJkePjhkduf\nmVkryy3oR6p0U80ZZ8Avf9m8/ZmZtZJcgn737pEd0Q/0hjfAHXc0b39mZq2kkKWbgc44w0FvZu2r\nLUo3CxbA5s2+2ZmZtae2KN2MHw+vex3ceWfz9mlm1iraonQDSZ3eJ2TNrB21TdCfdRbcfntz92lm\n1gpyK900s0YPcOaZyYVUPT3N3a+ZWd7aZkR/2GHJQ0nuuqu5+zUzy1vbBD1AqQQZ3hDOzGxUaIvp\nlQecfTb86EewcSPs39/8/ZuZ5aEtplcecM45MHs2nHceTJmS3N3y8ceb3w8zs2Zqq9LNpElw/fXw\n2GOwZUtSs//Wt5rfDzOzZmqr0k1/U6fCJZfAd7/rMo6ZFVtblW4GWrAgeTCJL6QysyJLDXpJSyV1\nS1qb0u40SXskvSdtm3mVbgaS4AMfgO98J++emJmNnHpG9MuAhbUaSBoD/APwk3p22ipBD7BoEdx4\noy+kMrPiSg36iFgN7EhpdilwI/Df9ew0jytjBzN7dvKowVWr8u6JmdnIGHaNXtIM4N0R8Q2grqey\nttKIHuCjH/XsGzMrrixOxn4VuLzf+9Swb7Wgv/BC+PWvk2mXZmZFMy69Sar/AayQJOBI4O2S9kTE\nymqNu7q62LoVrrkGLrqoRKlUyqALw3PQQclJ2U98Ar7wBTjttORErZlZHsrlMuUM79eiiEhvJM0F\nVkXEKSntllXafX+Q9RERHHMM/Pzn8KpXDaHHI+T55+Eb34AlS5IboP3VX8GHPpR3r8zMQBIRMeTh\nZ+qIXtJyoAR0SNoCdAITgIiIJQOap//WoPVKN5CE++WXw2WXwa23wkc+AnPnJvfHMTMbzeoa0We2\ns8qIvqMDHn4YOjqatuuG3XAD/N3fJbX7cVkUuMzMhmi4I/q2vjK2losuSm6T4Nk4Zjba5TKiHzcO\ndu1KHtrdytauhbe8Be6/H6ZPz7s3Ztauhjuib3rQ79kTTJwIe/eOjpktl10GTz4Jy5fn3RMza1ej\nLuh37gymTYMXX2zaboflxRdh/nw491z4m79Jbm1sZtZMo65G34ozbmo55JDk7pZHH508qOSCC/zc\nWTMbXRz0dZg+PbmQ6rHH4B3vgPPPh1/8Iu9emZnVJ5egb5UbmjXq4IPhz/8cvv1t+KM/gnvuybtH\nZmbpmh70o2FqZZqFC+Gb30xG9/fdl3dvzMxqa/qlQKOxdFPNe94DEcn0y4svhksvhVmz8u6VmdnL\nuXQzDBdemJyY7elJZuYsXuwRvpm1HpduhumYY+CrX4VHH4WTT07KOR//ODz3XN49MzNLeNZNRqZO\nTW6K9tBDMGYMnHQSXHvt6LlewMyKy6WbjE2Zktzu+PrrYcUKmDkzqeHffntS0zczazaXbkbImWfC\nf/wHPPAAnHAC/MVfwLHHQlcXbNqUd+/MrJ24dDPCZsxI7pezbh1873uwfTu8/vXJydtPfxpWrkw+\nMzMbKS7dNIkEr3sdXHUVPP10Mg9/6lS4+urkASfz58Nf/mXyy+CZZ/LurZkVSepNzSQtBd4JdEfE\n/CrrLwC+COwH9gCfioiqNwiQFFdfHaxbl9SxLbFnD9x7b1LHv/12WL0ajjwSFiyAefP6luOOa6+/\nhswsMeJ3r5R0JrAT+JdBgv6QiHix8voU4IaIOHGQbcWVVwaPP55MSbTq9u+HBx9Myj0PPti3bN4M\nc+Ykof/qVycXaL3ylcm/s2bBUUfB2LF5997Msjbiz4yNiNWS5tRY338C4SSSkf2g2q1GPxRjxiRz\n8k8++aWf9/bCxo3JCd7Nm+GRR+C222Dr1mTZvj25y+bMmcmN2Do6qi+TJyfLpEnJv4ccMjqeDWBm\nQ5PJLRAkvRv4e2AacH6ttu1ao8/ChAnJ/PyTTqq+vqcnqf9v3Qq//S08+2yybNsGGzYkr7dvh507\n4YUX+paenr7QnzQpCf6JE5P/p7R/x49Pnqk7dmzy78DXae/HjEl+yRxYBr6v9lk9bQb7bDBeZ0VW\n14NHKiP6VdVKNwPanQl0RsR5g6yPN76xk4kT4ayzoFQqUSqVhtJvy9C+fS8N/927+5aenpf+O/D1\n3r19y759g7+vtm7PnqRMFfHSpZ7PhvJ1g/E6azU9PWV6e8u/f79z5xdG/glT9QZ9pe2jwGkR8bJJ\ng5LiU58KZs5MntZkZmbpmvWEKVWWah04tt/rU4EJ1UL+AJduzMyaK7VGL2k5UAI6JG0BOoEJQETE\nEuBCSR8EeoFdwHtrba9drow1M2sV9cy6WZSy/h+Bf6x3h551Y2bWXL4y1sys4HxTMzOzgvNNzczM\nCs6lGzOzgvOI3sys4FyjNzMrOI/ozcwKzjV6M7OCc+nGzKzgXLoxMys4l27MzArOpRszs4JretDv\n3588WcjMzJqj6UF/0EF+dJmZWTM1PehdtjEzay4HvZlZwaUGvaSlkrolrR1k/SJJv6ksqyWdUmt7\nnnFjZtZc9YzolwELa6zfBLwpIhYAXwK+VWtjHtGbmTVXPY8SXC1pTo31a/q9XQPMrLU9B72ZWXNl\nXaP/KPDjWg0c9GZmzZXZjHZJ5wAfBs6s1a67u4uuruR1qVSiVCpl1QUzs0Iol8uUy+XMtqeISG+U\nlG5WRcT8QdbPB24C3hYRj9bYTrz5zcEttwy1u2Zm7UcSETHkK5DqLd2oslTrwGySkF9cK+QPcOnG\nzKy5Uks3kpYDJaBD0hagE5gAREQsAT4PHAF8XZKAPRFx+mDb8/RKM7PmqmfWzaKU9R8DPlbvDj2i\nNzNrLl8Za2ZWcLnc1MzMzJrHI3ozs4Jz0JuZFZxLN2ZmBecRvZlZwTnozcwKzkFvZlZwrtGbmRWc\nR/RmZgXnoDczKziXbszMCs4jejOzgnPQm5kVnEs3ZmYF5xG9mVnBpQa9pKWSuiWtHWT98ZJ+KWm3\npL9O256D3sysueoZ0S8DFtZY/yxwKfDlenbo0o2ZWXOlBn1ErAZ21Fi/LSJ+DeytZ4ce0ZuZNZdr\n9GZmBZf6cPCsXXFF1+/DvlQqUSqVmt0FM7OWVi6XKZfLmW1PEZHeSJoDrIqI+TXadAIvRMSVNdpE\nb28wfvyQ+mpm1pYkEREa6tfXW7pRZamnXU3jmv43hJlZe0sd0UtaDpSADqAb6AQmABERSyQdBdwN\nTAb2AzuBeRGxs8q2op6/IMzMrM9wR/R1lW6y4qA3M2tcs0o3ZmY2SjnozcwKzkFvZlZwDnozs4Jz\n0JuZFZyD3sys4Bz0ZmYF56A3Mys4B72ZWcE56M3MCs5Bb2ZWcA56M7OCc9CbmRWcg97MrOAc9GZm\nBZca9JKWSuqWtLZGm6skbZR0n6TXZttFMzMbjnpG9MuAhYOtlPR24NiIeA3wceCbGfWt0LJ88O9o\n52PRx8eij49FdlKDPiJWAztqNHkX8C+VtncCUyqPF7Qa/EPcx8eij49FHx+L7GRRo58JPNHv/ZOV\nz8zMrAX4ZKyZWcHV9XBwSXOAVRExv8q6bwK3RcT1lffrgbMjortKWz8Z3MxsCIbzcPBxdbZTZalm\nJXAJcL2k1wPPVQt5GF5HzcxsaFKDXtJyoAR0SNoCdAITgIiIJRHx75LeIekR4P8BHx7JDpuZWWPq\nKt2Ymdno1bSTsZLeJmm9pIclXd6s/bYCSbMk3SrpAUnrJP2vyudTJf1U0gZJP5E0Je++NoOkMZLu\nkbSy8r5dj8MUSd+T9FDlZ+MP2/hYfErS/ZLWSvqupAntdCyqXZha6/uX9NnKRaoPSXpr2vabEvSS\nxgBfI7nw6iTg/ZJOaMa+W8Re4K8j4iTgDOCSyvf/GeCWiDgeuBX4bI59bKZPAg/2e9+ux+GfgX+P\niBOBBcB62vBYSJoBXAqcWpnwMQ54P+11LKpdmFr1+5c0D3gvcCLwduDrkmqe/2zWiP50YGNEPB4R\ne4AVJBdatYWIeCYi7qu83gk8BMwiOQbXVZpdB7w7nx42j6RZwDuAa/p93I7H4TDgrIhYBhAReyPi\nd7ThsagYCxwqaRxwMMn1OG1zLAa5MHWw7/8CYEXlZ+YxYCNJxg6qWUE/8KKqrbTpRVWS5gKvBdYA\nRx2YoRQRzwDT8+tZ0/wTcBnQ/+RQOx6HY4BtkpZVylhLJB1CGx6LiHgKuALYQhLwv4uIW2jDYzHA\n9EG+/4YvUvUFU00kaRJwI/DJysh+4JnwQp8Zl3Q+0F3566bWn5qFPg4V44BTgasj4lSSGWufoc1+\nJgAkHU4yep0DzCAZ2f8pbXgsUgz5+29W0D8JzO73flbls7ZR+ZP0RuDbEXFz5ePuA/cFkvQK4L/z\n6l+TvBG4QNIm4F+BcyV9G3imzY4DJH/VPhERd1fe30QS/O32MwHwFmBTRGyPiH3AD4A30J7Hor/B\nvv8ngVf2a5eap80K+ruAV0uaI2kC8D6SC63ayf8FHoyIf+732UrgzyqvPwTcPPCLiiQiPhcRsyPi\nVSQ/A7dGxGJgFW10HAAqf5I/Iem4ykdvBh6gzX4mKrYAr5d0UOWk4ptJTta327EYeGHqYN//SuB9\nlZlJxwCvBn5Vc8sR0ZQFeBuwgeTEwWeatd9WWEhGsvuA+4B7gXsqx+MI4JbKcfkpcHjefW3iMTkb\nWFl53ZbHgWSmzV2Vn4vvA1Pa+Fh0kkxSWEty4nF8Ox0LYDnwFNBD8ovvw8DUwb5/khk4j1SO2VvT\ntu8LpszMCs4nY83MCs5Bb2ZWcA56M7OCc9CbmRWcg97MrOAc9GZmBeegNzMrOAe9mVnB/X/pXE2V\n8TJIPgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(ts, outputs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can still simulate different situations easily." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEACAYAAAC9Gb03AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGCJJREFUeJzt3X+QXGWd7/H3N5kkJBAI4C6QQAIEIiIGZCGygDpGCghc\nBVnvhQUtN1eB3YtKXauuP7Bc4rJVe/0D77rFctmwLCssCC6ghC0okMURCKCghPAj4fJDCAQJvyIm\nIYRAvveP02PG0DPdM9PTP06/X1Wnpnv66fM8fWrq08885znPicxEklRe41rdAEnS2DLoJankDHpJ\nKjmDXpJKzqCXpJIz6CWp5GoGfUTsGRF3RMSjEfFwRHy5SpnTI+KhynZ3RHxgbJorSRquqDWPPiJ2\nB3bPzGURsQPwS+CkzFw5oMwRwIrMfD0ijgcWZeYRY9lwSVJ9emoVyMwXgRcrj9dHxApgBrByQJn7\nBrzlvsrrkqQ2MKwx+ojYGzgE+PkQxb4A3DLyJkmSGqlmj75fZdjmOuDczFw/SJmPAQuBoxvTPEnS\naNUV9BHRQxHyV2bmjYOUmQssBo7PzLWDlHFhHUkagcyMkb633qGbfwEey8zvVXsxImYC1wOfzcyn\nhtpRZrplcv7557e8De2yeSw8Fh6LobfRqtmjj4ijgDOAhyPiQSCB84BZRW7nYuBbwC7AxRERwObM\nnDfq1kmSRq2eWTdLgfE1ypwJnNmoRkmSGscrY1ukt7e31U1oGx6LrTwWW3ksGqfmBVMNrSwim1mf\nJJVBRJBNOBkrSepQBr0klZxBL0klZ9BLUskZ9JJUcga9JJWcQS9JJWfQS1LJGfSSVHIGvSSVXFsH\n/Ztvwi9+0epWSFJna+ugv/FG+OQnYcuWVrdEkjpXWwf9nXfCmjXwwAOtbokkda62Dvqf/Qzmz4eb\nbmp1SySpc7Vt0L/2Gjz7LPz1X8OSJa1ujSR1rrYN+nvvhXnz4Oij4YUXitCXJA1f2wb90qVw1FEw\nfjyceKLDN5I0Um0f9ACf+IRBL0kj1Za3EnzrLdhll2LIZscdYd06mDEDnn++eC5J3aSUtxJ88EHY\nb7+toT51Knz4w3Dzza1tlyR1orYM+oHDNv1OOQWuv7417ZGkTtYxQX/SSXDbbbBxY2vaJEmdqu2C\nPrN60L/nPTB7Njz8cGvaJUmdqu2C/umnoacHZs5892sHHggrVjS/TZLUydou6Pt781Hl/PKBB8Jj\njzW/TZLUydou6B94AD70oeqvve99Br0kDVfNoI+IPSPijoh4NCIejogvD1LuHyLiiYhYFhGHjLRB\na9bA9OnVX7NHL0nDV0+P/m3gK5n5fuBPgXMi4oCBBSJiATA7M/cHzgYuGWmDXn0Vdt21+muzZxcX\nUb3xxkj3Lkndp2bQZ+aLmbms8ng9sAKYsU2xk4ArKmV+DuwUEbuNpEFDBX1PT3Eh1eOPj2TPktSd\nhjVGHxF7A4cAP9/mpRnAcwOer+bdXwZ1eeWVYirlYJx5I0nDU3fQR8QOwHXAuZWe/ZgYqkcPnpCV\npOHqqadQRPRQhPyVmXljlSKrgb0GPN+z8rt3WbRo0e8f9/b20tvb+/vnGzcW94edMmXwthx4IFxz\nTT2tlqTO1NfXR19fX8P2V9fqlRFxBfBKZn5lkNdPAM7JzBMj4gjg7zPziCrlhly98vnni6mVq6t+\nRRQeeQQ+/WlYubJmsyWpFEa7emXNHn1EHAWcATwcEQ8CCZwHzAIyMxdn5s0RcUJEPAlsABaOpDG1\nhm0A9t8fnnkGNm2CSZNGUoskdZeaQZ+ZS4HxdZT74mgbU+tELBThPmsWPPEEHHTQaGuUpPJrqytj\n6+nRgzNvJGk4OjboH3lk7NsjSWXQkUH/gQ8Y9JJUr44N+uXLx749klQGHRn0c+YUUzE3bBj7NklS\np2uroK9n1g3AhAlF2HuFrCTV1lZBX2+PHorhG28rKEm1dWzQz51r0EtSPTo26O3RS1J92ibo334b\n1q2DadPqK2/QS1J92iboX3sNdt4ZxtXZohkz4K234KWXxrZdktTp2ibohzNsAxBhr16S6tGxQQ9e\nOCVJ9ej4oLdHL0lDM+glqeTaJujrvSp2oIMOKq6OfeedsWmTJJVB2wT9SHr0O+0Ef/RH8PTTY9Mm\nSSqDjg56cPhGkmox6CWp5Ax6SSq5tgn6kZyMBYNekmppm6AfaY/+ve+FVavgjTca3yZJKoO2CPrM\nYq2bXXYZ/nsnTID99/cmJJI0mLYI+t/9DiZPhokTR/Z+h28kaXBtEfQjHbbp501IJGlwpQh6e/SS\nNLi2CPqRzrjpZ9BL0uDaIuhH26Pfc0948014+eXGtUmSyqIUQe9NSCRpcDWDPiIui4g1EVH1Fh8R\nsWNELImIZRHxcET8xXAbMdqgB4NekgZTT4/+cuC4IV4/B3g0Mw8BPgZcGBE9w2lEo4Leu01J0rvV\nDPrMvBtYO1QRYGrl8VTg1cx8eziNGO3JWLBHL0mDGVbPexAXAUsi4gVgB+DU4e6gET36/puQbNkC\n49rizIMktYdGBP1xwIOZOT8iZgM/iYi5mbm+WuFFixb9/nFvby+9vb0NCfpp04p9PPVUsSSCJHWq\nvr4++vr6Gra/yMzahSJmATdl5twqr/0H8HeZubTy/D+Br2XmA1XKZrX6Zs6Eu+6CWbNG8AkG+NSn\n4NRT4bTTRrcfSWonEUFmxkjfX+8gR1S2ap4Fjqk0ZjdgDjCsm/utXQs77zycd1R3+OFw//2j348k\nlUk90yuvBu4B5kTEqohYGBFnR8RZlSJ/CxxZmX75E+CrmflavQ3YsqVYYniHHUbS/D9k0EvSu9U1\ndNOwyqoM3axbB3vsAeurjugPz9q1xTDQb38L48ePfn+S1A6aNXQzZtatg6lTa5erx847w+67w8qV\njdmfJJVBqYIeHL6RpG2VLugPO8ygl6SBWh7069fbo5eksdTyoG90j/7QQ+GRR+Cttxq3T0nqZG0R\n9I2YWtlv++1hv/3goYcat09J6mRtEfSN7NEDHHkk3HNPY/cpSZ2qlEF/1FFw992N3ackdarSBv3S\npdDEa8EkqW2VMuj32acI+Weeaex+JakTtTzoGz29Eop7yPb36iWp27U86Bs966afQS9JhbYI+kb3\n6AGOPtqglyQocdAfcgj8+tfFSpaS1M1KG/QTJsC8ecWdqySpm5U26AHmz4ef/nRs9i1JnaL0QX/H\nHWOzb0nqFC0P+rGYXtnvsMOKcfpXXx2b/UtSJ2hp0G/ZAhs3wpQpY7P/CROK2Td9fWOzf0nqBC0N\n+vXri5AfN4atcPhGUrdradCP5fh8P4NeUrcrfdAffDC89BK88MLY1iNJ7ar0QT9uHHz843DbbWNb\njyS1q9IHPcAJJ8DNN499PZLUjlp+MnYsFjTb1vHHw09+Aps3j31dktRuuqJHv/vuMHs23Hvv2Ncl\nSe2mK4IeYMECh28kdaeuCXrH6SV1q5pBHxGXRcSaiFg+RJneiHgwIh6JiLqXEWtm0M+bV0yxXLWq\nOfVJUruop0d/OXDcYC9GxE7APwL/JTMPAv5rvZU3M+jHj4cTT4Qbb2xOfZLULmoGfWbeDawdosjp\nwPWZubpS/pV6Kx+r2wgO5pRT4IYbmlefJLWDRozRzwF2iYifRsT9EfHZet84litXVnPssfDgg/Dy\ny82rU5JaradB+zgUmA9sD9wbEfdm5pPVCi9atOj3j595ppepU3sb0IT6TJ4Mxx0HP/4xnHlm06qV\npGHp6+ujr4HL7kZm1i4UMQu4KTPnVnnta8B2mfntyvN/Bm7JzOurlM2B9X3kI3DBBfDRj47iEwzT\nD38Il18Ot9zSvDolaTQigsyMkb6/3qGbqGzV3AgcHRHjI2IK8CFgRT07bebJ2H4LFsDSpbB2qLMO\nklQi9UyvvBq4B5gTEasiYmFEnB0RZwFk5krgVmA5cB+wODMfq6fyVgT91KlwzDHwox81t15JapW6\nhm4aVtk2Qze77QYPPVQsUdBMN9wAF13kOvWSOsNoh25aGvRTphRrxTdziiXApk0wfTosWwZ77dXc\nuiVpuJo1Rt9w77xTBO722ze/7kmT4NOfhquvbn7dktRsLQv69euLkI8Rf0eNzmc+A1deCU38h0aS\nWqJlQd+KE7EDHXUUbNhQXEAlSWXWtUE/bhx8/vOweHHr2iBJzdC1QQ9F0F97bdEWSSqrlgZ9s2fb\nbGuPPYobh191VWvbIUljqat79AB/+ZdwySWelJVUXi2dddMOQT9/fnFS9p57Wt0SSRobXd+jHzcO\nzj0XvvvdVrdEksZG1wc9wMKFcOed8GTVhZUlqbMZ9BQXbp19tr16SeVk0Fd88Yvwgx949ylJ5dPV\n0ysH2n13OPVUuPDCVrdEkhrLHv0A3/wmXHoprFnT6pZIUuN0/fTKgfbaC844A77znVa3RJIaxx79\nNr7xDfjXf4XVq1vdEklqDIN+G3vsUayBc8EFrW6JJDWGQV/FeecV95RdvrzVLZGk0XPWTRU77wyL\nFhVXzLoGjqRO58nYQZx5Jrz6Klx/fatbIkmj05Kbg2/ZAj098PbbxVoz7erOO4tZOA8/DNOmtbo1\nkrrVaG8O3pKgX78edtutWDWy3f3VXxVfSJde2uqWSOpWow36lvSnN2wo1pfpBN/5Dtx6K9x+e6tb\nIkkjY9DXsOOO8E//VIzZv/56q1sjScNn0NdhwYJi+8IXnIUjqfMY9HX67neL9eovuaTVLZGk4elp\nRaWdGPTbbQc//CEceSTMmwd/8ietbpEk1admjz4iLouINREx5HWiEXF4RGyOiFNq7XPDBpgyZTjN\nbA/77w+LF8PJJ7sWjqTOUc/QzeXAcUMViIhxwP8Gbq2n0k7s0ff71KeKm5R84hPFRV+S1O5qBn1m\n3g2srVHsS8B1wEv1VNrJQQ/w1a/CIYcUNyp5661Wt0aShjbqk7ERMR04OTP/L1DXhP5OD/qIYsrl\nhAlw+unFBVWS1K4acTL274GvDXg+ZNgvWrSIu+6CTZugr6+X3t7eBjSh+SZMgGuvLcbrP/c5+P73\ni2UdJGm0+vr66Ovra9j+6loCISJmATdl5twqrz3d/xB4D7ABOCszl1Qpm5nJN79ZzGL51rdG1/h2\nsHFjMW4/aRJccw1MntzqFkkqm2YtgRAM0lPPzH0r2z4U4/T/o1rID9TpQzcDTZ4MS5YUn+fYY2Ft\nrbMZktRk9UyvvBq4B5gTEasiYmFEnB0RZ1UpXtd1o2+8UZ6gB5g4Ef7t34r59YcfXqx2KUntouao\ncmaeXu/OMvO/11OuTD36fuPGwYUXwgc/CPPnw0UXFbNyJKnVXAKhwT7zGbjttuJ2hJ//PPzud61u\nkaRuZ9CPgQ9+EJYtK2bhzJ0Ld9zR6hZJ6mYG/RiZOrWYa3/xxbBwIZx2Gjz3XKtbJakbGfRj7IQT\nYMUKmDOnuJr2b/7G4RxJzWXQN8GUKUXA338/PPEEzJ4NF1zgjUwkNYdB30T77gtXXglLlxaBv88+\n8KUvwcqVrW6ZpDJrWdB34jLFjTJnDlxxBTz0EOy0E/T2wjHHFF8C69a1unWSyqauJRAaVllEbtmS\n9PTAm28W68WoWPfnxz+Gq66Cn/0Mjj8e/uzPiittp01rdesktdpol0BoetBv3JjsuKPL+w7m1Vfh\nuuuKZRXuuquYqrlgQdHrP/TQ4ipcSd2l44L+lVeS/fZzTZh6bNwIfX1wyy1F6D/xBBx2GBx9dLHc\nwsEHw8yZxbLJksqr44L+2WeTI4+E559vWrWl8frrcN99Rej/8pfFGP8bbxQXZR18MBxwAOy3X7HN\nmuWyyVJZdFzQP/ZYcvLJ8PjjTau21F5+uQj85cuLHv+TTxbbb34De+0Fe+8N06fDjBnFz4HbrrsW\nJ8X9j0Bqbx0X9Pffn5x1FvzqV02rtitt2gS//jU8+yy88EKxrV699fFvflOcD3jnHdhll63brrsW\nP3fcsZgCu8MOW7eBz7ffvviSmDSp2CZO/MPHfnlIjTPaoG/6P/dlW6K4XU2aVAzlHHDA0OU2bizO\nl7z2WhH8/T/XrSumwb7+evEFsWFDcTP09eu3Pt6woTipvmnT1p+bNsHmzcWMqv7g7w//iRNh/Pjq\nW0/P4K9tWy7i3RtU/32tbbjvG4mRvM+6GvM+FZoe9N16sVS7mjy52KZPb9w+t2wpwr4/+Ad+Gbzz\nTvXt7bcHf23bcpl/uMG7f1fPNtz3jcRI3mddjXmftjLo1XDjxm3tyUsavW9/e3Tvb/qVsQa9JDWX\nQS9JJWfQS1LJGfSSVHIGvSSVXEuCvpuXKJakZrNHL0klZ9BLUskZ9JJUcga9JJWcQS9JJWfQS1LJ\n1Qz6iLgsItZExPJBXj89Ih6qbHdHxAeG2p9BL0nNVU+P/nLguCFefxr4SGYeDPwtcOlQO3M9eklq\nrprLFGfm3RExa4jX7xvw9D5gxlD7s0cvSc3V6DH6LwC3DFVg82bYbrsG1ypJGlTDbjwSER8DFgJH\nD1XOm1FLUnM1JOgjYi6wGDg+M9cOVTZzEYsWFY97e3vp7e1tRBMkqTT6+vro6+tr2P4i67ghY0Ts\nDdyUme+aURMRM4H/BD67zXh9tf3kvvsmTz01ssZKUjeKCDJzxGMhNXv0EXE10AvsGhGrgPOBiUBm\n5mLgW8AuwMUREcDmzJw32P48EStJzVVXj75hlUXkEUck997btColqeONtkff9CtjXYtekpqr6UHv\n0I0kNZdBL0klZ9BLUskZ9JJUcga9JJWcQS9JJWfQS1LJGfSSVHIGvSSVnEEvSSVn0EtSyRn0klRy\nBr0klZxBL0kl5zLFklRy9uglqeQMekkquaYH/fjxza5Rkrpb04NektRcBr0klZxBL0klZ9BLUskZ\n9JJUcga9JJWcQS9JJWfQS1LJGfSSVHI1gz4iLouINRGxfIgy/xART0TEsog4pLFNlCSNRj09+suB\n4wZ7MSIWALMzc3/gbOCSBrWt1Pr6+lrdhLbhsdjKY7GVx6JxagZ9Zt4NrB2iyEnAFZWyPwd2iojd\nGtO88vKPeCuPxVYei608Fo3TiDH6GcBzA56vrvxOktQGPBkrSSUXmVm7UMQs4KbMnFvltUuAn2bm\ntZXnK4GPZuaaKmVrVyZJepfMjJG+t6fOclHZqlkCnANcGxFHAL+tFvIwuoZKkkamZtBHxNVAL7Br\nRKwCzgcmApmZizPz5og4ISKeBDYAC8eywZKk4alr6EaS1LmadjI2Io6PiJUR8f8i4mvNqrcdRMSe\nEXFHRDwaEQ9HxJcrv985Im6LiMcj4taI2KnVbW2GiBgXEb+KiCWV5916HHaKiH+PiBWVv40PdfGx\n+J8R8UhELI+IqyJiYjcdi2oXpg71+SPiG5WLVFdExLG19t+UoI+IccBFFBdevR/484g4oBl1t4m3\nga9k5vuBPwXOqXz+rwO3Z+Z7gTuAb7Swjc10LvDYgOfdehy+B9ycme8DDgZW0oXHIiKmA18CDq1M\n+OgB/pzuOhbVLkyt+vkj4kDgvwHvAxYAF0fEkOc/m9Wjnwc8kZnPZuZm4BqKC626Qma+mJnLKo/X\nAyuAPSmOwfcrxb4PnNyaFjZPROwJnAD884Bfd+Nx2BH4cGZeDpCZb2fm63ThsagYD2wfET3AZIrr\ncbrmWAxyYepgn/+TwDWVv5lngCcoMnZQzQr6bS+qep4uvagqIvYGDgHuA3brn6GUmS8Cf9y6ljXN\n/wH+FzDw5FA3Hod9gFci4vLKMNbiiJhCFx6LzHwBuBBYRRHwr2fm7XThsdjGHw/y+Yd9kaoXTDVR\nROwAXAecW+nZb3smvNRnxiPiRGBN5b+bof7VLPVxqOgBDgX+MTMPpZix9nW67G8CICKmUfReZwHT\nKXr2Z9CFx6KGEX/+ZgX9amDmgOd7Vn7XNSr/kl4HXJmZN1Z+vaZ/XaCI2B14qVXta5KjgE9GxNPA\nD4D5EXEl8GKXHQco/qt9LjMfqDy/niL4u+1vAuAY4OnMfC0z3wF+BBxJdx6LgQb7/KuBvQaUq5mn\nzQr6+4H9ImJWREwETqO40Kqb/AvwWGZ+b8DvlgB/UXn8OeDGbd9UJpl5XmbOzMx9Kf4G7sjMzwI3\n0UXHAaDyL/lzETGn8quPA4/SZX8TFauAIyJiu8pJxY9TnKzvtmOx7YWpg33+JcBplZlJ+wD7Ab8Y\ncs+Z2ZQNOB54nOLEwdebVW87bBQ92XeAZcCDwK8qx2MX4PbKcbkNmNbqtjbxmHwUWFJ53JXHgWKm\nzf2Vv4sbgJ26+FicTzFJYTnFiccJ3XQsgKuBF4BNFF98C4GdB/v8FDNwnqwcs2Nr7d8LpiSp5DwZ\nK0klZ9BLUskZ9JJUcga9JJWcQS9JJWfQS1LJGfSSVHIGvSSV3P8HAxbQQy0Wi6EAAAAASUVORK5C\nYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "outputs = control_simulation_discrete(system=TankSystem(A=2, alpha=10, K=2, V=2, Fi=1), \n", " controller=DiscreteController(DeltaT=1, Kc=-0.5, tau_i=5, bias=0.5))\n", "plt.plot(ts, outputs);" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [default]", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }